package encore.portal.config;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import encore.log.Logger;
import encore.log.LoggerFactory;
import encore.portal.models.PageConfig;

public class RenderConfig {

	private static final Logger logger=LoggerFactory.getLogger(RenderConfig.class);
	
	private Map  pages;
	
	private String defaultPageId;
	
	private int orderNumberCounter=0;
	
	private Comparator pageComparator;
	
	public RenderConfig()
	{
		this.pages=new HashMap();
		this.pageComparator=new Comparator() {
			 public int compare(Object a, Object b)
			 {
				 PageConfig pa=(PageConfig)a;
				 PageConfig pb=(PageConfig)b;
				 
				 if(pa.getOrderNumber()>pb.getOrderNumber())
				 {
					 return 1;
				 }
				 else if(pa.getOrderNumber()==pb.getOrderNumber())
				 {
					 return 0;
				 }
				 else{
					 return 1;
				 }
				 
			 }
		};
	}
	
	
	public String getDefaultPageId()
	{
		return defaultPageId;
	}
	
	public void setDefaultPageId(String defaultPageId)
	{
	  this.defaultPageId=defaultPageId;	
	}
	
	public List  getPages(){
		List col=new ArrayList(pages.values());
		Collections.sort(col,pageComparator);
		return col;
	}
	
	public PageConfig getPageConfig(String pageId)
	{
		if(pageId==null||"".equals(pageId))
		{
			pageId=defaultPageId;
		}
		
		PageConfig retval=(PageConfig)pages.get(pageId);
		
		if(retval==null&&pageId.startsWith("/")&&pageId.length()>2)
		{
			retval=(PageConfig)pages.get(pageId.substring(1));
		}
		if(retval==null)
		{
			logger.warn("Couldn't find a PageConfig for page ID: [" + pageId + "]");
			if((retval=(PageConfig)pages.get(defaultPageId))!=null)
			{
				if(logger.isDebugEnabled())
				{
					logger.debug("Returning default page ID: [" + defaultPageId + "]");
				}
			}else
			{
				logger.error("Could not find default page Id for render config!");
			}
			
		}
		return retval;
	}
	
	public void addPage(PageConfig config){
		config.setOrderNumber(orderNumberCounter++);
		pages.put(config.getName(), config);
		
	}
	
	public void removePage(PageConfig config)
	{
		pages.remove(config.getName());
	}
	
}
